#include <fstream>
#include <iostream>
#include <sstream>

#include <unistd.h>

using namespace std;

int main(int argc, char* argv[])
{

	stringstream cantidadString;
	cantidadString << argv[2];
	int cantidad = 0;
	cantidadString >> cantidad;	

	ofstream* file = new ofstream(argv[1],ios::out);
	
	*file << "-- Creo las clases" << endl;
	*file << "CREATE CLASS 'AltaClaseA.txt'" << endl;
	*file << "CREATE CLASS 'AltaClaseB.txt'" << endl << endl;

	for (int k = 0; k < cantidad; k++)
	{
		*file << "-- Insercion numero " << (k + 1) << endl;
		
		int rnd = rand();
		int stringLength1 = rnd % 60;
	
		string randomString1 = "";
		for (int i = 0; i < stringLength1; i++)
		{
			int rnd2 = rand();
			int charIndex = rnd2 % 25 + 65;
			randomString1 += (char) charIndex;
		}
	
		int rnd4 = rand();
		int stringLength2 = rnd4 % 60 + 2;
	
		string randomString2 = "";
		for (int j = 0; j < stringLength2; j++)
		{
			int rnd5 = rand();
			int charIndex = rnd5 % 25 + 65;
			randomString2 += (char) charIndex;
		}
	
		int rnd3 = rand();
		int randomInt = ((rnd3 % 10000)*1000 + k);

		*file << "INSERT INTO B (X, T) VALUES (" << randomInt << ", '" << randomString1 << "')" << endl;
		*file << "INSERT INTO A (X, Z) VALUES (" << randomInt << ", '" << randomString2 << "')" << endl << endl;

	}

	file->close();
	
/*
	string* apellidos =  new string[15];
	{
	apellidos[0] = "Palacios";
	apellidos[1] = "Enriquez";
	apellidos[2] = "ApellidoAlgoLargoooooooooooooooooooooooooooooooooooooooooooooooooooooooo";
	apellidos[3] = "OtroApellidoBastaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanteLaaaaaaaaaaaaaaaaaaaaaargoooooooooooooooooooooooo";
	apellidos[4] = "Rodriguez Zapatero";
	apellidos[5] = "Mendizabal Araoz Lynch";
	apellidos[6] = "Contreras";
	apellidos[7] = "Alvarez Thomas";
	apellidos[8] = "Rios";
	apellidos[9] = "Riquelme";
	apellidos[10] = "Longobardi Paz";
	apellidos[11] = "Paz";
	apellidos[12] = "Estenssoro";
	apellidos[13] = "Rodriguez Alvarez";
	apellidos[14] = "Senna";
	}
	
	string* nombres =  new string[15];
	{
	nombres[0] = "Juan Pablo";
	nombres[1] = "Ezequiel";
	nombres[2] = "NombreeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeLaaaaaarrrrrrrrrrrrggggggggggggggooooooooooooooo";
	nombres[3] = "OtroNombreoBastaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanteLaaaaaaaaaaaaaaaaaaaaaargoooooooooooooooooooooooo";
	nombres[4] = "NombreeeeeeeeeeeeMedioLLlllllllllllllargo";
	nombres[5] = "Jose Maria";
	nombres[6] = "Adalberto Jacinto";
	nombres[7] = "Javier";
	nombres[8] = "Esteban Arnaldo";
	nombres[9] = "Juan Sebastian";
	nombres[10] = "Juan";
	nombres[11] = "Jose Clemente";
	nombres[12] = "Anibal Anastacio";
	nombres[13] = "Juan Pedro";
	nombres[14] = "Ernesto Jose";
	}

	string* nacimientos =  new string[15];
	{
	nacimientos[0] = "01/01/1980";
	nacimientos[1] = "02/02/1981";
	nacimientos[2] = "15/12/1950";
	nacimientos[3] = "15/07/1947";
	nacimientos[4] = "03/03/1974";
	nacimientos[5] = "29/11/1977";
	nacimientos[6] = "02/02/1982";
	nacimientos[7] = "14/06/1990";
	nacimientos[8] = "17/09/1966";
	nacimientos[9] = "18/08/1967";
	nacimientos[10] = "11/11/1911";
	nacimientos[11] = "12/01/1917";
	nacimientos[12] = "04/04/2000";
	nacimientos[13] = "05/05/1950";
	nacimientos[14] = "06/12/1970";
	}

	string* sueldos =  new string[15];
	{
	sueldos[0] = "100.05";
	sueldos[1] = "10214.12";
	sueldos[2] = "7500.05";
	sueldos[3] = "1200.22";
	sueldos[4] = "1250.00";
	sueldos[5] = "999.99";
	sueldos[6] = "1024.00";
	sueldos[7] = "2048.02";
	sueldos[8] = "789.78";
	sueldos[9] = "600.66";
	sueldos[10] = "1000.00";
	sueldos[11] = "15000.00";
	sueldos[12] = "4500.47";
	sueldos[13] = "6000.00";
	sueldos[14] = "7200.00";
	}

	if (argc != 3 || (*argv[1] != '1' && *argv[1] == '2' && *argv[1] == '3'))
	{
		cerr << "Modo de uso \"./Tester N M\"." << endl
                     << "   donde N es 1 para generar los archivos de insercion y borrado." << endl
		     << "              2 para ejecutar los archivos de borrado." << endl
		     << "              3 para ejecutar los archivos de insercion." << endl
		     << "   y M es la cantidad de archivos o ejecuciones a realizar." << endl << endl;
		return 1;
	}
	
	char* opcion = argv[1];
	
	stringstream cantidadString;
	cantidadString << argv[2];
	int cantidad = 0;
	cantidadString >> cantidad;
	
	cout << "Se van a procesar " << cantidad << " operaciones." << endl;
	
	// Ejecuta las inserciones
	if (*opcion == '3')
	{	
		for (int i = 0; i < cantidad; i++)
		{
			stringstream aux;		
			
			stringstream* s = new stringstream();
			*s << "./CapaIndices Inserciones/Insercion" << i << ".txt";
			
			system(s->str().c_str());
			
			cout << "El archivo \"Inserciones/Insercion" << i << ".txt\" fue ejecutado." << endl;
		}
	}
	
	// Ejecuta los borrados
	if (*opcion == '2')
	{
		for (int i = 0; i < cantidad; i++)
		{
			stringstream aux;		
			
			stringstream* s = new stringstream();
			*s << "./CapaIndices Borrados/Borrado" << i << ".txt";
			
			system(s->str().c_str());
			
			cout << "El archivo \"Borrados/Borrado" << i << ".txt\" fue ejecutado." << endl;
		}
	}
	
	// Generar archivos de inserciones
	if (*opcion == '1')
	{	
		for (int i = 0; i < cantidad; i++)
		{
			stringstream aux;
			aux << "Inserciones/Insercion" << i << ".txt";
			
			ofstream* file = new ofstream(aux.str().c_str(),ios::out);
			
			int  rnd = rand();
			int index = rnd % 15;
			int  rnd2 = rand();
			int index2 = rnd % 15;
			int  rnd3 = rand();
			int index3 = ( (rnd3 % 10000)*1000 + i);
			int  rnd4 = rand();
			int index4 = rnd % 15;
			int  rnd5 = rand();
			int index5 = rnd % 15;
			
			*file << "[Operacion]" << endl << "Nombre = Insercion" << endl << "Clase = Persona" << endl << endl << "[Datos]" << endl 
				<< "[Dato]" << endl << "Atributo = apellido" << endl << "Valor = " << apellidos[index] << endl 
				<< "[Dato]" << endl << "Atributo = nombre" << endl << "Valor = " << nombres[index2] << endl
				<< "[Dato]" << endl << "Atributo = DNI" << endl << "Valor = " << index3 << endl 
				<< "[Dato]" << endl << "Atributo = fechaNacimiento" << endl << "Valor = " << nacimientos[index4] << endl 
				<< "[Dato]" << endl << "Atributo = sueldo" << endl << "Valor = " << sueldos[index4] << endl;
				
			file->flush();
			file->close();
			
			stringstream aux2;
			aux2 << "Borrados/Borrado" << i << ".txt";
			
			ofstream* fileBorrado = new ofstream(aux2.str().c_str());
			
			*fileBorrado << "[Operacion]" << endl << "Nombre = Borrado" << endl << "Clase = Persona" << endl << endl 
				<< "[Condiciones]" << endl << "Tipo = AND" << endl 
				<< "[Condicion]" << endl 
				<< "Atributo = DNI" << endl 
				<< "Operador = =" << endl 
				<< "Valor = " << index3 << endl;
			
			fileBorrado->flush();
			fileBorrado->close();
			
			delete file;
			delete fileBorrado;
			
		}
		
		cout << "Se crearon " << cantidad << " de archivos de Insercion y " << cantidad << " archivos de Borrado." << endl;
	}

*/
	return 0;
}


